iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1
IoT

來與IoT譜寫一首戀愛樂章吧系列 第 16

op.16 《網路層》-Broker的基本防護與網路設定

  • 分享至 

  • xImage
  •  

op.16 控制混亂的時空

沒想到穿越的時空間裡充滿了混亂
沒辦法穩定的建立連結
看來只好對這時空間進行控制了

天啊!今天好多人都在烤肉,受不了欸......而且還可以烤到塑膠味猛衝,跟鬼一樣欸(怕

今日的主題:基本的防護與網路設定

昨天的 Broker 雖然實作完成了,但是欠缺基本的防護,等於是說任何人只要知道你的 IP 都可以對其灌入資料,像昨天只是暫時性的寫完正在紀錄文章時,就有其他不是自己的使用端加入進來,今天就是要來對其進行基本防護與網路相關的設定。

先附上昨天的程式碼

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Adapter;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Receiving;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;

namespace mqtt_3._0._5
{
    class Program
    {
        private static MqttServer MqttServer = null;
        static void Main(string[] args)
        {
            MqttAsync();
            while (true) ;

        }
        private static async Task MqttAsync()
        {
            var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883);
            var mqttServer = new MqttFactory().CreateMqttServer();
            await mqttServer.StartAsync(optionsBuilder.Build());
            mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");
            });
            mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId} 已連接!");
            });
            mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
            {
                Console.WriteLine($"Client:{e.ClientId}已離線!");
            });
        }
    }
}

那麼,在進行教學前,可以先至這位作者的 Github 觀看,內容極其豐富與精采,許多功能也都有提供例子可以參考看看。

那麼接下來就進入正題,關於基本防護的部分。

var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883).WithConnectionValidator(e =>
{
    if(e.Password != "PassWord")
    {
        e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
        return;
    }
});

在剛開始的 optionsBuilder 之中,我們修改了其內容,在後段加入了 WithConnectionValidator ,並且對應到 e 參數。在其中寫入了簡單的判斷,當如果密碼不對時,那便回傳 ReasonCode ,回應表示密碼或使用者名稱錯誤,這樣可以做到基本的防護,也算是可以做個簡單的加密。

這裡附上尚未輸入密碼時的 Broker 運行截圖,因為密碼錯誤,所以導致無法成功地建立連線。
https://ithelp.ithome.com.tw/upload/images/20201001/201290848bOZLhBcub.png

手機端的 APP 顯示則是
https://ithelp.ithome.com.tw/upload/images/20201001/201290841Z6wKcx5D5.jpg

在輸入密碼後,便可以正常連接
https://ithelp.ithome.com.tw/upload/images/20201001/20129084JkzU9hy2s1.jpg
https://ithelp.ithome.com.tw/upload/images/20201001/20129084ec8WH9r92N.png

到這邊就算是完成基本防護啦。

另外除了密碼防護外,也可以進行使用者名稱的限定,比如黑名單的概念。
這裡就放上簡單的 UserName 的程式碼供大家參考。

if (e.Username == "blacklist")
{
    e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
    return;
}

詳細更多深入功能可以進到 這裡 閱讀,作者真的很用心!


接下來就要進到設定網路的部分啦~相信一定有人因為有 AP 的關係,所以無法正確的連接,那這樣要怎麼辦呢?
很簡單,其實只要設定一下 AP 即可,這裡使用 小米 的作為使用範例。

1.進到設定頁面,各家畫面會有不同
https://ithelp.ithome.com.tw/upload/images/20201001/20129084fuD48CJpH2.png
2.找尋 "端口轉發"、"Port forwarding" 、 "連接埠轉送" 等字詞,總之各家的名子也會有所不同。
https://ithelp.ithome.com.tw/upload/images/20201001/201290842dlhQbfSwK.png
3.將 MQTT 的 Port (初始為:1883) 轉送到對應的區域網路的 IP。
https://ithelp.ithome.com.tw/upload/images/20201001/20129084eAoE79KOmM.png

這樣就完成設定啦!

那麼今天是中秋節,也祝各位中秋節快樂啦XD,記得還是要少吃一點以免中秋假期後體重上升喔 :)

今日的曲子:<<秋韻>>劉文金

Yes


上一篇
op.15《網路層》-自己的 Broker 自己造 by C#
下一篇
op.17 《應用層》-資料庫介紹與建置
系列文
來與IoT譜寫一首戀愛樂章吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言